//
// Created by ZYZ on 2020/6/12.
//

#ifndef TESTALGORITHM_LINEAR_STACK_H
#define TESTALGORITHM_LINEAR_STACK_H
#include "../../include/type_linear_stack.h"

#define STACK_INIT_SIZE  100       //存储空间初始分配量      //宏定义后边不要加分号，否则报错
#define STACKINCREMENT 10          //存储空间分配增量

typedef struct{
    SElemType * base;               //在构造之前和销殿之后，base 的值为 NULL
    SElemType * top;                //栈顶指针
    int stacksize;                  //当前已分配的存储空间，以元素为单位
}SqStack;

//----- 基本操作的函数原型说明 -----

//构造一个空栈 S
Status InitStack  (SqStack & S);

//销毁栈 S, S 不再存在
Status DestroyStack (SqStack & S);

//把 S 置为空栈
Status ClearStack (SqStack & S);

//若栈 S 为空栈，则返回 TRUE，否则返回 FALSE
Status StackEmpty (SqStack S);

//返回 S 的元素个数，即栈的长度
int StackLength  (SqStack S);

//若栈不空，则用 e 返回 S 的栈顶元素，并返回 OK；否则返回 ERROR
Status GetTop (SqStack S, SElemType &e);

//插入元素 e 为新的栈顶元素
Status Push (SqStack &S, SElemType e);

//若栈不空，则删除 S 的栈顶元素，用 e 返回其值，并返回 OK；否则返回 EROR
Status Pop  (SqStack &S, SElemType &e);

//从栈底到栈顶依次对栈中每个元素调用函数 visit()，一旦 visit() 失败，则操作失败
Status StackTraverse (SqStack S, Status  (* visit) (SElemType e));

#endif //TESTALGORITHM_LINEAR_STACK_H
